package com.graduate.emos.wx.config.shiro;


import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j    //使用日志输出
public class JwtUtil {
    @Value("${emos.jwt.secret}") //注入配置值
    private String secret; //存储秘钥

    @Value("${emos.jwt.expire}") //注入配置值
    private int expire;    //存储过期时间

    /**
     * 创建令牌
     * @param userId 用户id
     * @return Token令牌
     */
    public String createToken(int userId){
        //1.计算令牌过期的时间
        //DateUtil.offset(当前日期,要偏移的日期变量,偏移量)
        Date expireDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, expire);
        //2.把秘钥进行封装成一个加密算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        //3.创建令牌
        JWTCreator.Builder tokenBuilder = JWT.create();
        String token = tokenBuilder.withClaim("userId", userId).withExpiresAt(expireDate).sign(algorithm);
        return token;
    }

    /**
     * 反向从token令牌中获取用户的id
     * @param token 令牌
     * @return 用户id
     */
    public int getUserId(String token){
        //1.对令牌进行解码
        DecodedJWT decodeJwt = JWT.decode(token);
        //2.获取用户id
        int userId = decodeJwt.getClaim("userId").asInt();
        return userId;
    }

    /**
     * 验证token的有效性
     * @param token 令牌
     */
    public void verifierToken(String token){
        //1.把秘钥进行封装成一个加密算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        //2.创建验证对象
        JWTVerifier verifier = JWT.require(algorithm).build();
        //3.使用验证方法验证
        verifier.verify(token);
    }
}
